#ifndef MAINWINDOW_TCP_SERVER_H
#define MAINWINDOW_TCP_SERVER_H

#include <QMainWindow>
#include <QAbstractSocket>

class QLabel;
class QTcpServer;
class QTcpSocket;
class QCloseEvent;

namespace Ui {
class MainWindow_tcp_server;
}

class MainWindow_tcp_server : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow_tcp_server(QWidget *parent = nullptr);
    ~MainWindow_tcp_server();

protected:
    virtual void closeEvent(QCloseEvent* event);

private:
    QString get_local_ip() const;

    void init_widgets();

    void init_connections();

private slots:
    /***************************************************************************
     @date     2021-03-17
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    文本框显示socket链接模式
     @param    socket_state socket模式
    ***************************************************************************/
    void sl_socket_state_change(QAbstractSocket::SocketState socket_state);

    /***************************************************************************
     @date     2021-03-17
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    客户端链接上时，显示客户端相关信息
    ***************************************************************************/
    void sl_client_connected();

    /***************************************************************************
     @date     2021-03-17
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    客户端链断开时，显示客户端相关信息
    ***************************************************************************/
    void sl_client_disconnected();

    /***************************************************************************
     @date     2021-03-21
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    按行从socket读取纯文本数据
    ***************************************************************************/
    void sl_ready_read_from_socket();

    /***************************************************************************
     @date     2021-03-18
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    初始化socket的相关信号槽
    ***************************************************************************/
    void sl_init_socket_connections();

    /***************************************************************************
     @date     2021-03-18
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    服务器端启动监听，监听的ip地址和端口根据用户在窗体中的选择设置
    ***************************************************************************/
    void sl_server_start_listen();

    /***************************************************************************
     @date     2021-03-19
     @author   qiaowei
     @contact  weiweiqiao@126.com
     @version  1.0
     @brief    停止服务器监听，释放资源
    ***************************************************************************/
    void sl_server_stop_listen();

    void sl_server_clear_plain_text();

    void sl_exit_application();

    void sl_button_send_message();

private:
    void del_pointer(QObject* obj);

private:
    Ui::MainWindow_tcp_server *ui;

    QLabel* lbl_listen_;
    QLabel* lbl_socket_state_;
    QTcpServer* tcp_server_;
    QTcpSocket* tcp_socket_;
};

#endif // MAINWINDOW_TCP_SERVER_H
